package hoja3;

/* Universidad del Valle de Guatemala
 * Laboratorio 3
 * Mariana Castillo
 * Luis Alburez
 * Jose Pablo Rodriguez
 * Julio Maldonado
 * De La Cruz 
 * Descripcion: El main genera un archivo aleatorio de numeros y los ordena dependiendo del algoritmo implementado
 * Fecha: 28/07/13
 */

import java.io.*;
import java.util.*;

public class Hoja3 {
    public static void main(String[] args) {
        //Se crea el objeto Random
        Random rnd = new Random();
        
        //Se crea arraylist para controlar los datos de los .txt leidos
        ArrayList lista= new ArrayList();
        ArrayList ordenados= new ArrayList();
        ArrayList enorden= new ArrayList();
   
        //Se crea el objeto scan para el ingreso de datos
        Scanner scan = new Scanner(System.in);
        
        //Se utilza el algoritmo de orden implementado
        
        //MergeSort ordenar= new MergeSort();
        
        insertion ordenar= new insertion();
        //BubbleSort ordenar= new BubbleSort();
        
        //VARIABLES
        String op; //Opcion del menu
        int z=0; //Control de ciclo menu
       
        int[] orden2;
        int[] listanumeros;
        File archivo=null;
        //Se crea un menu
        while(z==0){
            //int contador=0; // Cantidad de numero aleatorios generados
            System.out.println("\nMENU \n 1. Crear archivo aleatorio\n 2. Ordenar Archivo Creado\n 3. Archivo en Orden\n 4. Salir\n ");
            op=scan.nextLine();
            lista.clear(); //Se limpia la lista cada vez que se ejecute la opcion 1
            if(op.equals("1")){
                int contador=0; // Cantidad de numero aleatorios generados
                System.out.println("Ingresar cantidad de numeros a generar");
                try{
                contador=scan.nextInt();
                scan.nextLine();
                }
                catch(Exception i){
                    System.out.println("Error: Debe ingresar un numero");
                    op=scan.nextLine();
                }
                // Se crea un archivo de texto
                File f = new File("numeros.txt");
                
                //Escritura
                    try{
                        FileWriter w = new FileWriter(f);
                        BufferedWriter bw = new BufferedWriter(w);
                        PrintWriter wr = new PrintWriter(bw); 
                        for(int i=0; i <contador; i++){
                            int num= (int)(rnd.nextDouble()*10000-5000); //Se genera un entero entre -5000 y 5000
                            lista.add(num);
                            String texto = Integer.toString(num); //Se convierte el entero a String
                            wr.write(texto); //Escribimos en el archivo
                            wr.append(" "); //Concatenmos sin borrar
                        }
                        wr.close(); //Se cierra el flujo de canal de datos, al cerralo el archivo quedara guaradado
                        bw.close(); 
                        }catch(IOException e){};
                        System.out.println("NUMEROS DESORDENADOS");
                        for(int a=0;a<lista.size();a++){
                            System.out.println((a+1)+") "+lista.get(a)+""); //Se imprimen los valores de la lista
                        }
      
            }
            else if(op.equals("2")){ 
                
                System.out.println("NUMEROS ORDENADOS");
                //Se lee el archivo numeros
                try{
                    File archivo1=new File("numeros.txt");
                    //Se verifica que el archivo numerosordenas exista
                    if(archivo1.exists()){
                        FileReader fr = new FileReader(archivo1); // se lee el archivo 
                        BufferedReader br = new BufferedReader(fr); // el archivo se coloca en el buffer

                        String linea; // variable linea contendra toda la cadena de caracteres que contenga el archivo
                        while((linea=br.readLine())!=null){ //Mientras hayas caracteres seguiran ejecutandose
                            ordenados.add(linea); //Se guarda la linea de caracteres
                        }
                        fr.close();
                        br.close();
                        // Se convierte a String el contenido de la lista
                        String s1= ordenados.get(0).toString();
                        
                        // Se utiliza StringTokenizar para separar el string cada vez que exista un espacio
                        StringTokenizer st= new StringTokenizer(s1," ");
                        listanumeros= new int[st.countTokens()];
                        int i=0;
                        while(st.hasMoreTokens()){
                            int numero= Integer.parseInt(st.nextToken());//Se convierte cada token a entero
                            listanumeros[i]=numero;
                            i++;
                        }
                        //Codigo para implementar QuickSort
                        //QuickSort ordenar = new QuickSort(listanumeros,0);
                        //ordenar.quicksort(listanumeros, ordenar.left,ordenar.right); //Se ordena el archivo
                        
                        //Codigo para implementar InsertionSort
                        ordenar.insertion_srt(listanumeros, listanumeros.length); //Se ordena el archivo
                        
                        //Codigo para implementar MergeSort
                        //ordenar.sort(listanumeros); //Se ordena el archivo
                        
                        //ordenar.bubbleSort(listanumeros, listanumeros.length); //Se ordena el archivo con BubbleSort
                        //****
                        File f2 = new File("numerosordenados.txt");
                        //Escritura
                        try{
                            FileWriter w = new FileWriter(f2); //Se habilita la escritura en el archivo
                            BufferedWriter bw = new BufferedWriter(w);
                            PrintWriter wr = new PrintWriter(bw); //Permite escribir en el archivo
                            for(int i1=0; i1 <listanumeros.length; i1++){
                                int numorden= listanumeros[i1];
                                System.out.println((i1+1)+") "+numorden);
                                String texto3 = Integer.toString(numorden); //Se convierte el entero a String
                                wr.write(texto3); //Escribimos en el archivo
                                wr.append(" "); //Concatenmos sin borrar
                            }
                            wr.close(); //Se cierra el flujo de canal de datos, al cerralo el archivo quedara guaradado
                            bw.close(); 
                            }catch(IOException e){};
                    }
                    else{
                        System.out.println("El archivo numeros no ha sido creado");
                    }

                }catch(Exception e1){}; 

            }
            else if(op.equals("3")){
               
                //Se lee el archivo numerosordenados
                try{
                    archivo=new File("numerosordenados.txt");
                    //Se verifica que el archivo numerosordenas exista
                    if(archivo.exists()){
                        FileReader fr = new FileReader(archivo); // se lee el archivo 
                        BufferedReader br = new BufferedReader(fr); // el archivo se coloca en el buffer

                        String linea; // variable linea contendra toda la cadena de caracteres que contenga el archivo
                        while((linea=br.readLine())!=null){ //Mientras hayas caracteres seguiran ejecutandose
                            enorden.add(linea); //Se guarda la linea de caracteres
                        }
                        fr.close();
                        br.close();
                        // Se convierte a String el contenido de la lista
                        String s= enorden.get(0).toString();
                        // Se separa el string cada vez que exista un espacio
                        StringTokenizer st= new StringTokenizer(s," ");
                        orden2= new int[st.countTokens()];
                        int i=0;
                        while(st.hasMoreTokens()){
                            int num3= Integer.parseInt(st.nextToken());//Se convierte cada token a entero
                            orden2[i]=num3;
                            System.out.println((i+1)+") "+orden2[i]);
                            i++;
                        }
                        //Codigo para implementar QuickSort
                        //QuickSort ordenar = new QuickSort(orden2,0);
                        //ordenar.quicksort(orden2, ordenar.left,ordenar.right); //Se ordena el archivo
                        
                        ordenar.insertion_srt(orden2, orden2.length); //Se vuele a ordenar el archivo
                        //****
                        File f3 = new File("numerosordenados2.txt");
                        //Escritura
                        try{
                            FileWriter w = new FileWriter(f3); //Se habilita la escritura en el archivo
                            BufferedWriter bw = new BufferedWriter(w);
                            PrintWriter wr = new PrintWriter(bw); //Permite escribir en el archivo
                            for(int i1=0; i1 <orden2.length; i1++){
                                int numorden= orden2[i1];
                                String texto3 = Integer.toString(numorden); //Se convierte el entero a String
                                wr.write(texto3); //Escribimos en el archivo
                                wr.append(" "); //Concatenmos sin borrar
                            }
                            wr.close(); //Se cierra el flujo de canal de datos, al cerralo el archivo quedara guaradado
                            bw.close(); 
                            }catch(IOException e){};
                    }
                    else{
                        System.out.println("El archivo numerosordenados.txt no ha sido creado");
                    }

                }catch(Exception e1){}; 
                
               
                
            } 
            //Fin del programa
            else if(op.equals("4")){
                z=1; //Se termina el ciclo de menu
                System.out.println("FIN");
            }
            else{
                System.out.println("Opcion Incorrecta");
            }
        }
                  
    }
}
